# coding: utf8
"""
异常处理
"""

import random

# try...except...finally捕获异常并处理
value = None
try:
    value = random.choice([1, "1"]) / random.randint(0, 10)
except ZeroDivisionError as zde:
    print("分母不能为0")
except Exception as ex:
    print(f"其他异常 {ex}")
finally:  # value变量最好try之外声明空值
    print(f"计算成功 {value}")


# 常用异常：Exception、BaseException
# 可以处理多个异常，也可以自定义错误


# 自定义错误类，并捕获
class CustomError(Exception):
    def __init__(self,
                 err="CustomError"):
        super().__init__(self, err)


try:
    raise CustomError("内容")
except CustomError:
    print("自定义错误内容")


# 利用自定义错误退出多次嵌套循环
class LoopError(Exception):
    def __init__(self, err="LoopError"):
        super().__init__(self, f"LoopError {err}")


for i in range(10):  # Loop1
    try:
        for j in range(10):  # Loop2
            if i > j:  # 这里使用break只会退出Loop2
                raise LoopError("退出最外层循环")
    except LoopError as le:
        break  # 这里退出Loop1


# 思考如果有3层循环，最内层有时退出Loop1，有时退出到Loop2，如何实现？


# 是否全部都用异常来处理？

# 建议能够明确错误的，使用if控制来提前规避异常：
def list_type(data):
    if not isinstance(data, list):
        return


# 如果明确判断None应：data is None
def not_none(data):
    if not data:
        return


# 打开资源后退出关闭
try:
    with open("a.txt", 'r') as fp:
        print(fp.read())
except FileNotFoundError as fnfe:
    print("[a.txt]不存在")
except:
    print("其他错误")
